package com.sena.engine.common.enums;


import org.apache.commons.lang3.StringUtils;

public enum ResultCodeEnum {
    /**
     * 请求参数非法
     */
    ILLEGAL_PARAM("ILLEGAL_PARAM", "请求参数非法", "404"),

    /**
     * 请求参数为空
     */
    ILLEGAL_PARAM_BLANK("ILLEGAL_PARAM_BLANK", "请求参数为空", "404"),

    /**
     * 请求参数为空
     */
    ILLEGAL_PARAM_NULL("ILLEGAL_PARAM_NULL", "请求参数为空", "404"),

    /**
     * 请求参数为空
     */
    ILLEGAL_PARAM_EMPTY("ILLEGAL_PARAM_EMPTY", "请求参数为空", "404"),

    /**
     * 请求参数超出范围
     */
    ILLEGAL_PARAM_OVERFLOW("ILLEGAL_PARAM_OVERFLOW", "请求参数超出范围", "404"),

    /**
     * 系统异常
     */
    SYSTEM_FAILURE("SYSTEM_FAILURE", "系统异常", "500"),

    /**
     * 处理成功
     */
    SUCCESS("SUCCESS", "处理成功", "200"),

    /**
     * 处理失败
     */
    FAIL("FAIL", "处理失败", "500"),

    /**
     * 服务器错误
     */
    SERVER_ERROR("SERVER_ERROR", "服务器错误", "500"),

    /**
     * 数据库异常
     */
    DATA_ACCESS_EXCEPTION("DATA_ACCESS_EXCEPTION", "数据库异常", "500"),

    /**
     * 数据库违反key唯一约束
     */
    DATA_DUPKEY_EXCEPTION("DATA_DUPKEY_EXCEPTION", "数据库违反key唯一约束", "400"),

    /**
     * 数据不存在
     */
    DATA_NOT_EXIST("DATA_NOT_EXIST", "数据不存在", "404"),

    /**
     * 数据已经存在
     */
    DATA_DUPLICATE("DATA_DUPLICATE", "已存在", "400"),

    /**
     * 锁定状态
     */
    USER_LOCK("USER_LOCK", "用户已锁定", "401"),

    /**
     * 未登录
     */
    USER_NO_LOGIN("USER_NO_LOGIN", "用户未登录", "401"),

    /**
     * 用户不存在
     */
    USER_NOT_EXIST("USER_NOT_EXIST", "用户不存在", "404"),

    /**
     * 该用户无权限
     */
    USER_NOT_PERMISSION("USER_NOT_PERMISSION", "该用户无权限", "404"),

    /**
     * 用户已存在
     */
    USER_DUPLICATE("USER_DUPLICATE", "用户已存在", "400"),


    /**
     * 无权访问
     */
    NO_PERMISSION_ACCESS("NO_PERMISSION_ACCESS", "无权访问", "402"),

    /**
     * 用户名为空
     */
    LOGIN_NAME_EMPTY("LOGIN_NAME_EMPTY", "用户名为空", "400"),

    /**
     * 参数错误
     */
    SYSTEM_PARA_ERROR("SYSTEM_PARA_ERROR", "参数错误", "400"),


    /**
     * 不合法的参数
     */
    INVALID_PARAMETER("INVALID_PARAMETER", "不合法的参数", "400"),

    /**
     * 状态不符合
     */
    ERROR_STATUS("ERROR_STATUS", "状态不符合", "400"),

    /**
     * 未知异常
     */
    UNKNOWN_EXCEPTION("UNKNOWN_EXCEPTION", "未知异常", "500"),

    /**
     * 文件未找到
     */
    FILE_NOT_FOUND("FILE_NOT_FOUND", "文件未找到", "404"),


    /** ======================= 返回结果信息 ==================== */
    /**
     * 请求成功
     */
    LBC_RESULT_OK("OK", "请求成功", "200"),

    /**
     * 请求失败
     */
    LBC_RESULT_FAIL("FAIL", "请求失败", "400"),

    /**
     * 存证或信息被接受
     */
    LBC_RESULT_ACCEPTED("ACCEPTED", "存证或信息被接受", "201"),

    /**
     * 请求信息不符合要求
     */
    LBC_RESULT_BAD_REQUEST("BAD_REQUEST", "请求信息不符合要求", "406"),

    /**
     * 无权限访问或授权失败
     */
    LBC_RESULT_FORBIDDEN("FORBIDDEN", "无权限访问或授权失败", "402"),

    /**
     * 资源未找到
     */
    LBC_RESULT_NOT_FOUND("NOT_FOUND", "资源未找到", "404"),

    /**
     * 请求超时
     */
    LBC_RESULT_REQUEST_TIMEOUT("REQUEST_TIMEOUT", "请求超时", "504"),


    /**
     * 服务器内部错误
     */
    LBC_RESULT_INTERNAL_SERVER_ERROR("INTERNAL_SERVER_ERROR", "服务器内部错误", "500");


    /**
     * codeType
     */
    private String codeType = null;

    /**
     * 描述
     */
    private String description = null;

    /**
     * code值
     */
    private String code = null;

    /**
     * @param codeType    of type String
     * @param description of type String
     */
    ResultCodeEnum(String codeType, String description, String code) {
        this.codeType = codeType;
        this.description = description;
        this.code = code;
    }

    public String getCodeType() {
        return codeType;
    }

    public String getDescription() {
        return description;
    }

    public String getCode() {
        return code;
    }

    /**
     * 通过枚举<code>codeType</code>获得枚举
     *
     * @param codeType
     * @return
     */
    public static ResultCodeEnum getByCodeType(String codeType) {
        if (StringUtils.isBlank(codeType)) {
            return null;
        }

        for (ResultCodeEnum result : values()) {
            if (codeType.equalsIgnoreCase(result.getCodeType())) {
                return result;
            }
        }

        return null;
    }

}
